﻿/**
 * \file Creation.xaml.cs
 * \brief Classe Creation.xaml
 * \author ARTUR Vincent
 * \author LAPERDRIX Pierre
 * \version 1.0
 */

namespace WpfJeu
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
    using Implem;
    using Xceed.Wpf.Toolkit;

    /**
     * \class Creation
     * \brief Menu de création de la partie
     */
    public partial class Creation : UserControl
    {
        /*!< Nombre maximum de joueurs */
        public static readonly int nbMaxJoueurs = 5;

        /*!< Nombre minimum de joueurs*/
        public static readonly int nbMinJoueurs = 2;

        /*!< Liste des civilisations choisies par les joueurs */
        private List<ComboBox> civilisations;

        /*!< Liste des noms choisis par les joueurs */
        private List<TextBox> noms;

        /*!< Liste des couleurs choisies par les joueurs */
        private List<ColorPicker> couleurs;

        /**
         * \fn public Creation()
         * \brief Constructeur de Creation
         */
        public Creation()
        {
            InitializeComponent();
            
            //Ajout des civilisations a la liste civilisations
            civilisations = new List<ComboBox>();
            civilisations.Insert(0,civi1);
            civilisations.Insert(1,civi2);

            //Ajout des noms des joueurs a la liste noms
            noms = new List<TextBox>();
            noms.Insert(0, nom1);
            noms.Insert(1, nom2);

            //Ajout des couleurs a la liste couleurs
            couleurs = new List<ColorPicker>();
            couleurs.Insert(0, couleur1);
            couleurs.Insert(1, couleur2);

        }

        /**
         * \fn private void joueurPlus(object sender, RoutedEventArgs e)
         * \brief Ajoute les éléments de sélection pour un joueur supplémentaire
         * \param sender
         * \param e
         */
        private void joueurPlus(object sender, RoutedEventArgs e)
        {
            int nb = int.Parse(nbJoueurs.Text);
            if (nb < nbMaxJoueurs)
            {

                //Creation du stack panel pour le nouveau joueur
                StackPanel sp = new StackPanel();
                sp.Orientation = Orientation.Horizontal;
                sp.HorizontalAlignment = HorizontalAlignment.Center;

                TextBlock tb1 = new TextBlock();
                tb1.Text = "Joueur n°" + (nb+1);
                sp.Children.Add(tb1);

                TextBlock tb2 = new TextBlock();
                tb2.Margin = new Thickness(30, 0, 0, 0);
                tb2.Text = "Nom : ";
                sp.Children.Add(tb2);

                TextBox tNom = new TextBox();
                tNom.Width = 100;
                tNom.Margin = new Thickness(10, 0, 0, 0);
                tNom.MaxLength = 20;
                sp.Children.Add(tNom);

                ComboBox cb = new ComboBox();
                cb.Margin = new Thickness(20,0,0,0);
                cb.Width = 200;
                cb.Items.Add(new ComboBoxItem() { Content = "Civilisation INFO", IsSelected=true});
                cb.Items.Add(new ComboBoxItem() { Content = "Civilisation EII" });
                sp.Children.Add(cb);

                ColorPicker cp = new ColorPicker();
                cp.Margin = new Thickness(20, 0, 0, 0);
                switch (nb)
                {
                    case 2:
                        cp.SelectedColor = Colors.BlueViolet;
                        break;
                    case 3 :
                        cp.SelectedColor = Colors.DarkOrange;
                        break;
                    case 4:
                        cp.SelectedColor = Colors.Olive;
                        break;
                }
                cp.ShowStandardColors = false;
                cp.Width = 100;
                sp.Children.Add(cp);

                //Insertion dans les listes des civilisations, des noms et des couleurs
                civilisations.Insert(nb,cb);
                noms.Insert(nb, tNom);
                couleurs.Insert(nb, cp);

                //Ajout dans le stack panel des choix de civilisations
                choix.Children.Insert(nb, sp);

                //Incrementation du nombre de joueurs
                nbJoueurs.Text = (++nb).ToString();
            }
        }

        /**
         * \fn private void joueurMoins(object sender, RoutedEventArgs e)
         * \brief Supprime les éléments de sélection du dernier joueur ajouté
         * \param sender
         * \param e
         */
        private void joueurMoins(object sender, RoutedEventArgs e)
        {
            int nb = int.Parse(nbJoueurs.Text);
            if (nb > nbMinJoueurs)
            {
                nbJoueurs.Text = (--nb).ToString();

                choix.Children.RemoveAt(nb);
                civilisations.RemoveAt(nb);
                noms.RemoveAt(nb);
                couleurs.RemoveAt(nb);
            }
        }

        /**
         * \fn private void lancerPartie(object sender, RoutedEventArgs e)
         * \brief Lance la partie avec les choix effectués par les différents joueurs
         * \param sender
         * \param e
         */
        private void lancerPartie(object sender, RoutedEventArgs e)
        {
            //Boolean qui permet de ne pas lancer la partie si tous les joueurs n'ont pas entre leurs noms
            bool lancement = true;

            //Liste qui stocke le nom des joueurs
            List<string> listeNoms = new List<string>();
            //Liste qui stocke la couleur de chaque joueur
            List<Color> listeCouleurs = new List<Color>();

            //Nombre de joueurs
            int nb = int.Parse(nbJoueurs.Text);

            //On teste si les noms des joueurs ne sont pas vides
            for (int i = 0; i < nb; i++)
            {
                if (noms[i].Text.Trim() == "")
                {
                    lancement = false;
                    Xceed.Wpf.Toolkit.MessageBox.Show("Veuillez entrer un nom pour le joueur n°" + (i+1), "Nom manquant", MessageBoxButton.OK, MessageBoxImage.Information);
                }
                else
                {
                    listeNoms.Insert(i, noms[i].Text.Trim());
                    listeCouleurs.Insert(i, couleurs[i].SelectedColor);
                }
                
            }

            if (lancement)
            {

                //Definition de la strategie
                typeStrategie s;
                switch (strategie.SelectedIndex)
                {
                    case 0: s = typeStrategie.petiteCarte; break;
                    case 1: s = typeStrategie.moyenneCarte; break;
                    default: s = typeStrategie.grandeCarte; break;
                }

                //Definition des civilisations
                List<typeCivil> listeCivi = new List<typeCivil>();
                foreach (ComboBox c in civilisations)
                {
                    switch (c.SelectedIndex)
                    {
                        case 0:
                            listeCivi.Add(typeCivil.info);
                            break;
                        default:
                            listeCivi.Add(typeCivil.eii);
                            break;
                    }
                }

                //Creation de la partie
                MainWindow jeu = new MainWindow(s, nb, listeNoms, listeCivi, listeCouleurs);
                jeu.Show();

                //Apres fermeture
                Window.GetWindow(this).Content = new Menu();
                
            }
        }

    }
}
